#include<iostream>
#include<pthread.h>
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
using namespace std;

__thread int g_val = 0;

void * thread(void * arg)
{
    while(1)
    {
        cout<<(char*)arg<<" : "<<g_val<<" &:"<<&g_val<<endl;
        g_val++;
        sleep(1);
    }
    return NULL;
}

int main()
{
    pthread_t tid1,tid2,tid3;
    pthread_create(&tid1, nullptr, thread, (void *)"thread 1 running...");
    pthread_create(&tid2, nullptr, thread, (void *)"thread 2 running...");
    pthread_create(&tid3, nullptr, thread, (void *)"thread 3 running...");

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);
    pthread_join(tid3, nullptr);


    return 0;
}
















// void *thread1(void *arg)
// {
//     printf("thread 1 returning ..,\n");
//     int *p = (int *)malloc(sizeof(int));
//     *p = 1;
//     return (void*)p;
// }


// void *thread2(void *arg)
// {
//     printf("thread 2 exiting ..,\n");
//     int *p = (int *)malloc(sizeof(int));
//     *p = 2;
//     pthread_exit((void *)p);   //该值会返回给主线程ret
// }


// void *thread3(void * arg)
// {
//     while (1)
//     {
//         printf("thread 3 is running ..\n");
//         sleep(1);
//     }

//     return nullptr;
    
// }

// int main()
// {
//     pthread_t tid;
//     void *ret;

//     //thread 1 return
//     pthread_create(&tid, nullptr, thread1, nullptr);
//     pthread_join(tid, &ret);     //相当于  二级指针&ret  指向 void*p  ,   那么 *(&ret) 其实就相当于ret，又相当于是 ret = p;
//     printf("thread 1 return, thread id %X, return code:%d\n", tid, *(int *)ret);   //%X 大写打印16进制
//     free(ret);

//     //thread 2 exit
//     pthread_create(&tid, nullptr, thread2, nullptr);
//     pthread_join(tid, &ret);    //跟thread 1 一样，只不过换了一种方式
//     printf("thread 2 exit, thread id %X, return code:%d\n", tid, *(int *)ret);
//     free(ret);

//     // thread 3 cancle by other
//     pthread_create(&tid, nullptr, thread3, nullptr);
//     sleep(3);
//     pthread_cancel(tid);
//     pthread_join(tid, &ret);
//     if(ret == PTHREAD_CANCELED)
//         printf("thread 3 cancled by other, thread id %X, return code:PTHREAD_CANCELED\n", tid);
//     else
//         printf("thread 3 cancled by other, thread id %X, return code:nullptr\n", tid);


//     return 0;
// }










// void * threadRun(void* args)
// {
//     const string name = (char *)args;
//     while(true)
//     {
//         cout<<name<<", pid:"<<getpid()<<", tid："<<pthread_self()<<endl;
//         sleep(1);
//     }
// }


// int main()
// {
//     pthread_t tid[5];
//     char name[64];
//     for(int i = 0;i<5;i++)
//     {
//         snprintf(name, sizeof name, "%s-%d", "thread", i);
//         pthread_create(tid+i, nullptr, threadRun, (void *)name);
//         cout<<tid[i]<<endl;
//         sleep(10);  
//     }
//     while(true)
//     {
//         cout<<"main pthread: pid :"<<getpid()<<", tid："<<pthread_self()<<endl;
//         sleep(1);
//     }

//     return 0;
// }